package com.zzy.product.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zzy.product.entity.*;
import com.zzy.product.feign.CouponFeignService;
import com.zzy.product.service.*;
import com.zzy.product.vo.*;
import com.zzy.utils.to.SkuReductionTo;
import com.zzy.utils.to.SpuBoundTo;
import com.zzy.utils.utils.PageUtils;
import com.zzy.utils.utils.Query;
import com.zzy.product.mapper.SpuInfoMapper;
import com.zzy.utils.utils.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Slf4j
@Service("spuInfoService")
public class SpuInfoServiceImpl extends ServiceImpl<SpuInfoMapper, SpuInfoEntity> implements SpuInfoService {
	
	@Autowired
	private SpuInfoDescService descService;
	
	@Autowired
	private SpuImagesService imagesService;
	
	@Autowired
	private AttrService attrService;
	
	@Autowired
	private ProductAttrValueService valueService;
	
	@Autowired
	private SkuInfoService skuInfoService;
	
	@Autowired
	private SkuImagesService skuImagesService;
	
	@Autowired
	private SkuSaleAttrValueService skuSaleAttrValueService;
	
	@Autowired
	private CouponFeignService couponFeignService;
	
	/**
	 * TODO: 高级部分完善（事务回滚，超时回滚....）
	 * @param vo
	 */
	@Transactional
	@Override
	public void saveSpuInfo(SpuSaveVo vo) {
		/*1、保存spu基本信息 pms_spu_info*/
		SpuInfoEntity infoEntity = new SpuInfoEntity();
		BeanUtils.copyProperties(vo, infoEntity);
		infoEntity.setCreateTime(new Date());
		infoEntity.setUpdateTime(new Date());
		this.saveBaseSpuInfo(infoEntity);
		/*2、保存spu的描述图片 pms_spu_info_desc*/
		List<String> decript = vo.getDecript();
		SpuInfoDescEntity descEntity = new SpuInfoDescEntity();
		descEntity.setSpuId(infoEntity.getId());
		descEntity.setDecript(String.join(",", decript));
		descService.saveSpuInfoDesc(descEntity);
		/*3、保存spu的图片集 pms_spu_images*/
		List<String> images = vo.getImages();
		imagesService.saveImages(infoEntity.getId(), images);
		/*4、保存spu的规格参数 pms_product_attr_value*/
		List<BaseAttrs> baseAttrs = vo.getBaseAttrs();
		List<ProductAttrValueEntity> collect = baseAttrs.stream().map((attr) -> {
			ProductAttrValueEntity productAttrValueEntity = new ProductAttrValueEntity();
			productAttrValueEntity.setAttrId(attr.getAttrId());
			AttrEntity id = attrService.getById(attr.getAttrId());
			productAttrValueEntity.setAttrName(id.getAttrName());
			productAttrValueEntity.setAttrValue(attr.getAttrValues());
			productAttrValueEntity.setQuickShow(attr.getShowDesc());
			productAttrValueEntity.setSpuId(infoEntity.getId());
			return productAttrValueEntity;
		}).collect(Collectors.toList());
		valueService.saveProductAttr(collect);
		/*5、爆粗spu积分信息 gulimall_sma -> sms_spu_bounds*/
		Bounds bounds = vo.getBounds();
		SpuBoundTo spuBoundTo = new SpuBoundTo();
		BeanUtils.copyProperties(bounds, spuBoundTo);
		spuBoundTo.setSpuId(infoEntity.getId());
		R r = couponFeignService.saveSpuBounds(spuBoundTo);
		if (r.getCode() != 0) {
			log.error("远程保存spu积分信息失败");
		}

		/*5、保存当前spu对应所有sku信息 */
		/*5.1、sku基本信息 pms_sku_info*/
		List<Skus> skus = vo.getSkus();
		if (skus != null && skus.size() > 0) {
			skus.forEach(item -> {
				String defaultImg = "";
				for (Images image : item.getImages()) {
					if (image.getDefaultImg() == 1) {
						defaultImg = image.getImgUrl();
					}
				}
				SkuInfoEntity skuInfoEntity = new SkuInfoEntity();
				BeanUtils.copyProperties(item, skuInfoEntity);
				skuInfoEntity.setBrandId(infoEntity.getBrandId());
				skuInfoEntity.setCatalogId(infoEntity.getCatalogId());
				skuInfoEntity.setSaleCount(0L);
				skuInfoEntity.setSpuId(infoEntity.getId());
				skuInfoEntity.setSkuDefaultImg(defaultImg);
				skuInfoService.saveSkuInfo(skuInfoEntity);

				Long skuId = skuInfoEntity.getSkuId();


				List<SkuImagesEntity> imagesEntities = item.getImages().stream().map(img -> {
					SkuImagesEntity skuImagesEntity = new SkuImagesEntity();
					skuImagesEntity.setSkuId(skuId);
					skuImagesEntity.setImgUrl(img.getImgUrl());
					skuImagesEntity.setDefaultImg(img.getDefaultImg());
					return skuImagesEntity;
				}).filter(entity -> {
					/*返回true就是需要，false就是删除*/
					return !StringUtils.isEmpty(entity.getImgUrl());
				}).collect(Collectors.toList());
				/*5.2、sku图片信息 pms_sku_images*/
				/*TODO:没有图片路径的无需保存*/
				skuImagesService.saveBatch(imagesEntities);

				List<Attr> attr = item.getAttr();
				List<SkuSaleAttrValueEntity> skuSaleAttrValueEntities = attr.stream().map(a -> {
					SkuSaleAttrValueEntity attrValueEntity = new SkuSaleAttrValueEntity();
					BeanUtils.copyProperties(a, attrValueEntity);
					attrValueEntity.setSkuId(skuId);
					return attrValueEntity;
				}).collect(Collectors.toList());
				/*5.3、sku销售属性 pms_sku_sale_attr_value*/
				skuSaleAttrValueService.saveBatch(skuSaleAttrValueEntities);

				/*5.4、sku优惠满减等信息 gulimall_sms -> sms_sku_ladder\sms_sku_full_reduction\sms_member_price*/
				SkuReductionTo skuReductionTo = new SkuReductionTo();
				BeanUtils.copyProperties(item, skuReductionTo);
				skuReductionTo.setSkuId(skuId);
				if (skuReductionTo.getFullCount() > 0 || skuReductionTo.getFullPrice().compareTo(new BigDecimal("0")) == 1) {
					R r1 = couponFeignService.saveSkuReduction(skuReductionTo);
					if (r1.getCode() != 0) {
						log.error("远程保存sku优惠信息失败");
					}
				}
				

			});
			
			
		}
		
		
		
		
		
	}
	
	@Override
    public PageUtils queryPage(Map<String, Object> params) {
        IPage<SpuInfoEntity> page = this.page(
                new Query<SpuInfoEntity>().getPage(params),
                new QueryWrapper<SpuInfoEntity>()
        );

        return new PageUtils(page);
    }
	
	@Override
	public void saveBaseSpuInfo(SpuInfoEntity spuInfoEntity) {
		this.baseMapper.insert(spuInfoEntity);
	}
	
	@Override
	public PageUtils queryPageByCondition(Map<String, Object> params) {
		QueryWrapper<SpuInfoEntity> wrapper = new QueryWrapper<>();
		String key = (String) params.get("key");
		if (!StringUtils.isEmpty(key)) {
			wrapper.and((w) -> {
				w.eq("id", "key").or().like("spu_name", key);
			});
		}
		String status = (String) params.get("status");
		if (!StringUtils.isEmpty(status)) {
			wrapper.eq("publish_status", status);
		}
		String brandId = (String) params.get("brandId");
		if (!StringUtils.isEmpty(brandId) && !"0".equalsIgnoreCase(brandId)) {
			wrapper.eq("brand_id", brandId);
		}
		String catelogId = (String) params.get("catelogId");
		if (!StringUtils.isEmpty(catelogId) && !"0".equalsIgnoreCase(catelogId)) {
			wrapper.eq("catalog_id", catelogId);
		}
		IPage<SpuInfoEntity> page = this.page(new Query<SpuInfoEntity>().getPage(params), wrapper);
		
		return new PageUtils(page);
	}
	
	
}













